import { reactive, reactiveObject } from '.'

const methodsArray = [
  'push',
  'pop',
  'unshift',
  'shift',
  'splice',
  'reverse',
  'sort'
]

export function createPrototype(target) {
  const arrayProto = Object.create(target.__proto__)
  methodsArray.forEach(method => {
    const oldMethod = target[method]
    arrayProto[method] = function (...args) {
      // 执行原型链默认方法
      oldMethod.apply(target, args)
      // 响应式
      switch (method) {
        case 'push':
        case 'unshift':
          reactive(args)
          break
        case 'splice':
          reactive(args.slice(2))
          break
        // ? 弹出之后，是否要去掉dep-watcher依赖
      }
      // 触发更新
      target.__ob__.dep.notify()
    }
  })
  target.__proto__ = arrayProto
}
/**
 * 数组响应式
 * @param {Array} target
 * ? 如果target原型链上也自定义过，那不能直接替换原型链
 */
export function reactiveArray(target) {
  createPrototype(target)
  reactiveObject(target)
}
